home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / programming / other / gtlayout / source / ltp_spread.c < prev    next >
C/C++ Source or Header  |  1999-04-19  |  4KB  |  207 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1998 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #include "Assert.h"
  15.  
  16. VOID
  17. LTP_Spread(LayoutHandle *Handle,ObjectNode *Group,LONG Width,LONG Height)
  18. {
  19.     ObjectNode *Node;
  20.     LONG Count = 0;
  21.  
  22.     SCANGROUP(Group,Node)
  23.     {
  24.         Count++;
  25.     }
  26.  
  27.     if(Group->Special.Group.Horizontal)
  28.     {
  29.         LONG Room = Width - Group->Width,Index = 0;
  30.         LONG Left,Width;
  31.  
  32.         if(Count > 1)
  33.         {
  34.             Left = 0;
  35.  
  36.             Room += --Count * Handle->InterWidth;
  37.         }
  38.         else
  39.             Left = Room / 2;
  40.  
  41.         SCANGROUP(Group,Node)
  42.         {
  43.             if(!LIKE_STRING_KIND(Node) || Node->Special.String.LinkID == -1)
  44.             {
  45.                 Width = Node->Width;
  46.  
  47.                 switch(Node->LabelPlace)
  48.                 {
  49.                     case PLACE_LEFT:
  50.  
  51.                         if(Node->Type == MX_KIND)
  52.                         {
  53.                             Left += Node->Special.Radio.LabelWidth + INTERWIDTH;
  54.  
  55.                             if(Node->Label)
  56.                             {
  57.                                 if(Node->Special.Radio.TitlePlace == PLACETEXT_LEFT)
  58.                                     Left += Node->LabelWidth + INTERWIDTH;
  59.                                 else
  60.                                     Width += INTERWIDTH + Node->LabelWidth;
  61.                             }
  62.                         }
  63.                         else
  64.                         {
  65.                             if(Node->Label)
  66.                                 Left += Node->LabelWidth + INTERWIDTH;
  67.                         }
  68.  
  69.                         break;
  70.  
  71.                     case PLACE_RIGHT:
  72.  
  73.                         if(Node->Type == MX_KIND)
  74.                         {
  75.                             Width += INTERWIDTH + Node->Special.Radio.LabelWidth;
  76.  
  77.                             if(Node->Label)
  78.                             {
  79.                                 if(Node->Special.Radio.TitlePlace == PLACETEXT_LEFT)
  80.                                     Left += Node->LabelWidth + INTERWIDTH;
  81.                                 else
  82.                                     Width += INTERWIDTH + Node->LabelWidth;
  83.                             }
  84.                         }
  85.                         else
  86.                         {
  87.                             if(Node->Label)
  88.                                 Width += INTERWIDTH + Node->LabelWidth;
  89.                         }
  90.  
  91.                         break;
  92.                 }
  93.  
  94.                 switch(Node->Type)
  95.                 {
  96.                     case LISTVIEW_KIND:
  97.  
  98.                         if(Node->Special.List.ExtraLabelWidth)
  99.                             Left += Node->Special.List.ExtraLabelWidth + INTERWIDTH;
  100.  
  101.                         break;
  102.  
  103.                     case SLIDER_KIND:
  104.  
  105.                         switch(Node->Special.Slider.LevelPlace)
  106.                         {
  107.                             case PLACETEXT_RIGHT:
  108.  
  109.                                 Width += INTERWIDTH + Node->Special.Slider.LevelWidth;
  110.                                 break;
  111.  
  112.                             case PLACETEXT_LEFT:
  113.  
  114.                                 if(Node->LabelPlace != PLACE_LEFT)
  115.                                     Left += INTERWIDTH + Node->Special.Slider.LevelWidth;
  116.  
  117.                                 break;
  118.                         }
  119.  
  120.                         break;
  121.  
  122.                     #ifdef DO_LEVEL_KIND
  123.                     {
  124.                         case LEVEL_KIND:
  125.  
  126.                             if(Node->Special.Level.LevelFormat != NULL)
  127.                             {
  128.                                 switch(Node->Special.Level.LevelPlace)
  129.                                 {
  130.                                     case PLACETEXT_RIGHT:
  131.  
  132.                                         Width += INTERWIDTH + Node->Special.Level.MaxLevelWidth;
  133.                                         break;
  134.  
  135.                                     case PLACETEXT_LEFT:
  136.  
  137.                                         if(Node->LabelPlace != PLACE_LEFT)
  138.                                             Left += INTERWIDTH + Node->Special.Level.MaxLevelWidth;
  139.  
  140.                                         break;
  141.                                 }
  142.                             }
  143.  
  144.                             break;
  145.                     }
  146.                     #endif    /* DO_LEVEL_KIND*/
  147.                 }
  148.  
  149.                 Node->Left = Left;
  150.  
  151.                 Left += Width + ((Room * (Index + 1)) / Count - (Room * Index) / Count);
  152.  
  153.                 Index++;
  154.             }
  155.         }
  156.     }
  157.     else
  158.     {
  159.         LONG Room = Height - Group->Height,Index = 0;
  160.         LONG Height,Top,y;
  161.  
  162.         if(Count > 1)
  163.         {
  164.             Top = 0;
  165.  
  166.             Room += --Count * Handle->InterHeight;
  167.         }
  168.         else
  169.             Top = Room / 2;
  170.  
  171.         SCANGROUP(Group,Node)
  172.         {
  173.             if(!LIKE_STRING_KIND(Node) || Node->Special.String.LinkID == -1)
  174.             {
  175.                 if(Count++)
  176.                 {
  177.                     if(Node->ExtraSpace > 0)
  178.                         y = Top + Node->ExtraSpace * Handle->InterHeight;
  179.                     else
  180.                     {
  181.                         if(Node->ExtraSpace < 0)
  182.                             y = Top - Node->ExtraSpace;
  183.                         else
  184.                             y = Top + Node->LayoutSpace * Handle->InterHeight;
  185.                     }
  186.                 }
  187.                 else
  188.                     y = Top;
  189.  
  190.                 if(Node->LabelPlace == PLACE_ABOVE && Node->Label)
  191.                     y += Handle->GlyphHeight + INTERHEIGHT;
  192.  
  193.                 Node->Top = y;
  194.  
  195.                 if(Node->LabelPlace == PLACE_BELOW && Node->Label)
  196.                     Height = Node->Height + INTERHEIGHT + Handle->GlyphHeight;
  197.                 else
  198.                     Height = Node->Height;
  199.  
  200.                 Top = y + Height + ((Room * (Index + 1)) / Count - (Room * Index) / Count);
  201.  
  202.                 Index++;
  203.             }
  204.         }
  205.     }
  206. }
  207.